package com.tutu.user.controller;

import com.tutu.commons.checks.UserCheckParam;
import com.tutu.commons.checks.UserLogin;
import com.tutu.commons.checks.UserRegister;
import com.tutu.commons.pojo.User;
import com.tutu.commons.utils.CollectError;
import com.tutu.commons.utils.R;
import com.tutu.user.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;


/**
 * @Program: b2c-cloud-store
 * @Description:
 * @Author: JK.TuTu
 * @Version: 1.0
 * @Create: 2022-12-13 19:32
 **/
@Slf4j
@RestController
@RequestMapping("/user")
@Api("用户相关api")
public class UserController {

    @Autowired
    private UserService userService;


    /**
     * 通过用户名检查用户是否存在
     *
     * @param userCheckParam 前端传递参数 校验
     * @param result         获取校验结果的实体对象
     * @return 返回结果实体对象
     */
    @ApiOperation("通过用户名检查用户是否存在")
    @PostMapping("/check")
    public R checkUserExist(@RequestBody @Validated UserCheckParam userCheckParam, BindingResult result) {
        if (result.hasErrors()) {
            return R.fail("账号为null,不可使用!");
        }
        return userService.checkUserExist(userCheckParam) ? R.fail("账号已存在,不可注册!") : R.ok("用户不存在,可以注册!");
    }

    /**
     * 用户注册
     *
     * @param user   接受前端注册参数
     * @param result 校验结果
     * @return 返回结果实体对象
     */
    @ApiOperation("用户注册")
    @PostMapping("/register")
    public R register(@RequestBody @Validated(UserRegister.class) User user, BindingResult result) {
        log.info("注册的用户信息:{}", user);

        if (result.hasErrors()) {
            String errorInfo = CollectError.getErrorInfo(result);
            return R.fail(errorInfo + "注册失败!");
        }
        return userService.register(user);
    }


    /**
     * 用户登录
     *
     * @param user   登录时的参数
     * @param result 检验结果
     * @return 返回结果实体对象
     */
    @ApiOperation("用户登录")
    @PostMapping("/login")
    public R login(@RequestBody @Validated(UserLogin.class) User user, BindingResult result) {
        log.info("登录的用户信息:{}", user);
        if (result.hasErrors()) {
            String errorInfo = CollectError.getErrorInfo(result);
            return R.fail(errorInfo + "登录失败!");
        }
        return userService.login(user);
    }


}
